﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using CapaLogica.CL.Carrera;
using CapaLogica.CL.Usuario;
using CapaLogica.CL.UtilidadesGenerales;
using CapaLogica.CL.PeriodoLectivo;


namespace CapaLogica.CL.Carrera
{
    public  class GestorCarrera
    {

        /// <summary>
        /// Método de la clase encargada de insertar una nueva Carrera a la DB 
        /// </summary>
        /// <param name="pcodigoCurso">Codigo de la Carrera, tipo String</param>
        /// <param name="pnombre">Nombre de la Carrera, tipo String</param>
        /// <param name="pdescripcion">Descripcion de la carrera, tipo String</param>
        /// <param name="pestado">Estado de la carrera, tipo Byte</param>
        /// <remarks></remarks>
        public static String registrarCarrera(String pcodigoCarrera, String pnombre, String pdescripcion) {

            try
            {

                Cl_Carrera objCarrera = new Cl_Carrera(pcodigoCarrera, pnombre, pdescripcion);
                CarreraPersistente _CarreraPersist = new CarreraPersistente();

                PeriodoPersistente persistentePeriodo = new PeriodoPersistente();

                CL_PeriodoLectivo periodo = persistentePeriodo.obtenerPeriodoActual();
                
                if (periodo != null)
                {
                    _CarreraPersist.registrarCarrera(objCarrera, Session.Id);
                }
                else
                {
                    throw new Exception("No se puede abrir un grupo si no hay un Periodo Lectivo Abierto.");
                }
               
          
                return "¡La carrera ha sido creada!";

            }
            catch (Exception ex)
            {

                throw ex;
            }
            
           
        }

        /// <summary>
        /// Método de la clase encargada de eliminar una nueva Carrera a la DB 
        /// </summary>
        /// <param name="pcodigoCurso">Codigo de la Carrera, tipo String</param>
        /// <param name="pnombre">Nombre de la Carrera, tipo String</param>
        /// <param name="pdescripcion">Descripcion de la carrera, tipo String</param>
        /// <param name="pestado">Estado de la carrera, tipo Byte</param>
        /// <remarks></remarks>
        public static int eliminarCarrera(int pidCarrera)
        {
            try
            {
                
                CarreraPersistente _CarreraPersist = new CarreraPersistente();

                _CarreraPersist.eliminarCarrera(pidCarrera, Session.Id);
                return 1;
     
            }
            catch (Exception ex)
            {

                throw ex;
            }
            

        }


        

        /// <summary>
        /// Método de la clase encargada de modificar una nueva Carrera a la DB 
        /// </summary>
        /// <param name="pcodigoCurso">Codigo de la Carrera, tipo String</param>
        /// <param name="pnombre">Nombre de la Carrera, tipo String</param>
        /// <param name="pdescripcion">Descripcion de la carrera, tipo String</param>
        /// <param name="pestado">Estado de la carrera, tipo Byte</param>
        /// <remarks></remarks>
        public static List<EsCarrera> buscarCarrera(String pcodigoCarrera, String pnombre)
        {
            try
            {
                CarreraPersistente persistenteCarrera = new CarreraPersistente();
                List<EsCarrera> listaCarreras = persistenteCarrera.buscarCarrera(pcodigoCarrera, pnombre);
                return listaCarreras;
            }
            catch (Exception)
            {
                throw;
            }


        }

        public static ArrayList consultarCarrera(int pIdCarrera)
        {
            try
            {
                ArrayList datosCarrera = new ArrayList();
                CarreraPersistente persistenteCarrera = new CarreraPersistente();
                Cl_Carrera carrera = persistenteCarrera.buscarCarreraPorId(pIdCarrera);
                List<Cl_Curso> cursos = carrera.Cursos;
                List<Array> datosCursos = new List<Array>();
                string[] curso = new string[3];
                Cl_Curso temp = null;

                for (int i = 0; i < cursos.Count; i++)
                {
                    temp = cursos[i];
                    curso[0] = temp.codigoCurso + "";
                    curso[1] = temp.nombre;
                    curso[2] = temp.descripcion;
              
                    datosCursos.Add(curso);

                }

                datosCarrera.Add(carrera.Nombre);
                datosCarrera.Add(carrera.Descripcion);
                datosCarrera.Add(datosCursos);

                return datosCarrera;

            }
            catch (Exception)
            {

                throw;
            }

        }


        public static String modificarCarrera(int pid_carrera, String pcodigo_carrera, String pnombre, String pdescripcion, List<int> pIdsCursos, int idDirector, int idViejo)
        {
            try
            {
                CarreraPersistente persistenteCarrera = new CarreraPersistente();
                CursoPersistente persistenteCurso = new CursoPersistente();
                Cl_Carrera carrera = new Cl_Carrera(pid_carrera, pcodigo_carrera, pnombre, pdescripcion);

                List<int> idsBD = persistenteCurso.buscarIdsCursosDeCarrera(pcodigo_carrera);

                //persistenteCarrera.actualizarCarrera(carrera, pIdsCursos, idsBD, 163, idDirector, idViejo);
               persistenteCarrera.actualizarCarrera(carrera, pIdsCursos, idsBD, Session.Id, idDirector, idViejo);

                return "¡Se ha modificado la carrera!";

            }
            catch (Exception ex)
            {

                throw ex;
            }

        }


        /// <summary>
        /// Método de la clase que lista todas las carreras del un estudiante.
        /// </summary>
        /// <remarks></remarks>
        public static List<EsCarrera> listarCarrerasEstudiante(int pidUsuario)
        {
            try
            {
                CarreraPersistente persistenteCarrera = new CarreraPersistente();
                List<EsCarrera> listaCarreras = persistenteCarrera.listarCarrerasEstudiante(pidUsuario);
                return listaCarreras;
            }
            catch (Exception)
            {
                throw;
            }

        }



        /// <summary>
        /// Método de la clase que lista todas las carreras del un estudiante.
        /// </summary>
        /// <remarks></remarks>
        public static List<Informacion> listarCarrerasDirectorAcademico(int pidUsuario)
        {
            try
            {
                CarreraPersistente persitente = new CarreraPersistente();
                List<EsCarrera> listTemp = persitente.listarCarrerasDirectorAcademico(pidUsuario);
                List<Informacion> datosCarreras = new List<Informacion>();

              

                foreach (EsCarrera temp in listTemp)
                {
                    datosCarreras.Add(temp);
                }

                return datosCarreras;
            }
            catch (Exception)
            {

                throw;
            }

        }


        /// <summary>
        /// Método de la clase que lista todas las carreras del un estudiante.
        /// </summary>
        /// <remarks></remarks>
        public static List<Informacion> listarCarrerasSinDirector()
        {
            try
            {
                CarreraPersistente persitente = new CarreraPersistente();
                List<EsCarrera> listTemp = persitente.listarCarrerasSinDirectorAcademico();
                List<Informacion> datosCarreras = new List<Informacion>();

               


                foreach (EsCarrera temp in listTemp)
                {
                    datosCarreras.Add(temp);
                }

                return datosCarreras;
            }
            catch (Exception)
            {

                throw;
            }

        }

        /// <summary>
        /// Método de la clase que lista todas las carreras del un estudiante.
        /// </summary>
        /// <remarks></remarks>
        public static List<Informacion> listarCarrerasEstudianteUi(int pidUsuario)
        {
            try
            {
                CarreraPersistente persitente = new CarreraPersistente();
                List<EsCarrera> listTemp = persitente.listarCarrerasEstudiante(pidUsuario);
                List<Informacion> datosCarreras = new List<Informacion>();

          


                foreach (EsCarrera temp in listTemp)
                {
                    datosCarreras.Add(temp);
                }

                return datosCarreras;
            }
            catch (Exception)
            {

                throw;
            }

        }

        /// <summary>
        /// Método de la clase que lista todas las carreras del sistema.
        /// </summary>
        /// <remarks></remarks>
        public static List<Informacion> listarTodasLasCarreras()
        {

            try
            {
                CarreraPersistente persitente = new CarreraPersistente();
                List<EsCarrera> listTemp = persitente.buscarTodasLasCarreras();
                List<Informacion> datosCarreras = new List<Informacion>();

                if (listTemp.Count == 0)
                {
                    throw new Exception("No hay carreras registradas en el sistema.");
                }


                foreach (EsCarrera temp in listTemp)
                {
                    datosCarreras.Add(temp);
                }

                return datosCarreras;
            }
            catch (Exception)
            {
                
                throw;
            }
            
        }

        /// <summary>
        /// Método de la clase que lista todas las carreras del sistema.
        /// </summary>
        /// <remarks></remarks>
        public static List<Informacion> buscarCarrerasAsociadasCurso(int pid)
        {

            try
            {
                CarreraPersistente persitente = new CarreraPersistente();
                List<EsCarrera> listTemp = persitente.buscarCarrerasAsociadasCurso(pid);
                List<Informacion> datosCarreras = new List<Informacion>();

                foreach (EsCarrera temp in listTemp)
                {
                    datosCarreras.Add(temp);
                }

                return datosCarreras;
            }
            catch (Exception)
            {

                throw;
            }

        }



    }

}

